// 在此处定义所有和用户相关的路由器处理函数,
// 供 /router/user.js 模块进行调用

// 导入数据库操作模块
const db = require('../db/index');
// 导入 加密模块
const bcrypt = require('bcryptjs');
const { use } = require('../router/user');
// 生成token 的包
const jwt = require('jsonwebtoken');
// 导入 全局配置文件
const config = require('../config');

// 注册
exports.regUser = (req, res) => {
    // 获取 客户端提交到服务器的 用户信息
    const userInfo = req.body;
    console.log(userInfo);
    // 对表单中的数据,进行合法性效验!
    // if (!userInfo.username || !userInfo.password) {
    //     return res.send({ status: 0, message: '用户名或密码不合法!' });
    // }

    // 使用 express-joi 包 验证

    // 定义 SQL 语句,查询用户名是否被占用
    const sqlSelect = 'SELECT * FROM ev_users WHERE username=?';
    db.query(sqlSelect, [userInfo.username], (err, results) => {
        // SQL语句执行失败
        if (err) {
            // return res.send({ status: 1, message: err.message });
            return res.cc(err);
        }
        // 判断用户名是否被占用
        if (results.length > 0) {
            // return res.send({ status: 1, message: '用户名已被占用,请更换其他用户名!' });
            return res.cc('用户名已被占用,请更换其他用户名!');
        }

        //TODO 用户名可以使用
        // 对密码 加密
        userInfo.password = bcrypt.hashSync(userInfo.password, 10);
        console.log(userInfo);
        // 定义 插入新用户 的sql语句
        const sqlInsert = 'INSERT INTO ev_users SET ?';
        // 定义 插入数据
        const post = { username: userInfo.username, password: userInfo.password };
        // 调用 db.query()
        db.query(sqlInsert, post, (err, results) => {
            //失败
            if (err) {
                // return res.send({ status: 1, message: err.message });
                return res.cc(err);
            }
            // 判断影响行数是否为1
            if (results.affectedRows !== 1) {
                // return res.send({ status: 1, message: '注册用户失败!请重新再试!' });
                return res.cc('注册用户失败!请重新再试!');
            }
            // 注册成功
            // res.send({ status: 0, message: '注册成功!' });
            res.cc('注册成功!', 0);
        });
    });
    // res.send('reguser ok!');
    console.log('reguser ok!');
}

// 登录
exports.login = (req, res) => {
    // 接受 表单数据
    const userInfo = req.body;
    console.log(userInfo);
    // SQL语句: 查询用户名是否存在
    const sqlSelect = 'SELECT * FROM my_db_01.ev_users WHERE username=?';
    // 执行 SQL 语句,查询用户数据
    db.query(sqlSelect, userInfo.username, (err, results) => {
        // 执行 SQL 语句失败
        if (err) return res.cc(err);
        // 执行 SQL 语句成功, 但是查询的数据 不等1 
        if (results.length !== 1) return res.cc('登录失败!账号错误...');

        // 判断密码是否一致
        // 输入密码 与 数据库密码 进行对比
        const compareResult = bcrypt.compareSync(userInfo.password, results[0].password);
        // 结果不为真,则登录失败
        if (!compareResult) return res.cc('登录失败!密码错误...');

        // 登录成功,生成 Token
        // 剔除 密码/用户头像 等敏感信息
        const user = { ...results[0], password: null, user_pic: null };
        // 生成 Token
        const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn });
        // 将 Token 响应给客户端
        res.send({
            status: 0,
            message: '登录成功!',
            token: 'Bearer ' + tokenStr
        });
    });

}
